package com.hxht.storage.server.pojo;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * 星期中的某一天的 计划录像时间模板
 * @author zhouyg
 *
 */
@Entity
//@Table(schema="storage")
public class DayTemplateInfo extends BaseEntity{

	@ManyToOne(cascade = CascadeType.PERSIST)
	private WeekTemplateInfo weekTemplate;
	
	/** 表示星期几<br/>
	 * 取值范围：1~7，代表 星期一~星期日 */
	private Integer weekIndex;
	
	/** 0-时间段录像，1-全天录像 <br/>
	 * 默认全天录像*/
	private Boolean isWholeDayMode;
	
	/** 录像类型，当mode为0时可忽略此参数
    // 0-定时录像，1-移动侦测录像，2-报警录像，3-移动侦测或报警录像，4-移动侦测和报警录像，
    // 5-命令触发录像，6-智能报警录像，10-PIR报警，11-无线报警，12-呼救报警，
    // 13-移动侦测、PIR、无线、呼救等所有报警类型的“或”，14-智能交通事件，15-越界侦测，
    // 16-区域入侵，17-声音异常，18-场景变更侦测，
    // 19-智能侦测(越界侦测|区域入侵|进入区域|离开区域|人脸识别)，20-人脸侦测
     * 
     */
	private Integer recordType;
	
    /** 计划录像的 分段录像时间<br/>
     *  最多不能超过8个时间片段，因海康NVR限制
     *  */
	@OneToMany(mappedBy = "dayTemplate", fetch = FetchType.EAGER,
			cascade = CascadeType.REMOVE)
    private Set<TimePeriodInfo> schedTimeList;
    
    public DayTemplateInfo(){
    	// 默认为 分时间段计划录像，当时时间段为0，也就是 全天不计划录像
    	schedTimeList = new HashSet<TimePeriodInfo>();
    	isWholeDayMode = false;
    	recordType = 0;
    }
	
    public Integer getWeekIndex() {
		return weekIndex;
	}

	public void setWeekIndex(Integer weekIndex) {
		this.weekIndex = weekIndex;
	}

	public void setRecordType(Integer recordType) {
		this.recordType = recordType;
	}

	public Boolean isWholeDayMode() {
		return isWholeDayMode;
	}

	public void setIsWholeDayMode(Boolean isWholeDayMode) {
		this.isWholeDayMode = isWholeDayMode;
	}

	public int getRecordType() {
		return recordType;
	}

	public Set<TimePeriodInfo> getSchedTimeList() {
		return schedTimeList;
	}

	public void setSchedTimeList(Set<TimePeriodInfo> schedTimeList) {
		this.schedTimeList = schedTimeList;
	}

	/**
	 * 将TimePeriodBean 时间片段加入 计划录像参数前，要判断该时间片段是否有效，并且和 当前已有的计划时间片段有所重复
	 * @param time
	 */
	public void addSchedTime(TimePeriodInfo time){
		
		// 表明 全天录像，不允许添加时间片段
		if (isWholeDayMode)
			return;
		
		if (time == null || !time.isValid())
			return;
		
		if (isRepeatSchedTime(time))
			return;
		
		// 最多只让配置8个无重复的时间片段
		if (schedTimeList.size() >=8)
			return;
		
		schedTimeList.add(time);
		
	}
	
	/** 
	 * 判断 TimePeriodBean,是否和 计划录像参数中现有的时间片有 重复的时间区间
	 * */
	public boolean isRepeatSchedTime(TimePeriodInfo time) {

		boolean isRepeat = false;
		
		for (TimePeriodInfo bean : schedTimeList){
			
			// 两个TimePeriodBean只要有重叠的时间段 就返回true;
			if (time.isRepeat(bean))
				isRepeat = true;
			
			if (isRepeat)
				break;
		}
		
		return isRepeat;
	}

	public WeekTemplateInfo getWeekTemplate() {
		return weekTemplate;
	}

	public void setWeekTemplate(WeekTemplateInfo weekTemplate) {
		this.weekTemplate = weekTemplate;
	}
}
